﻿ScreenCapture()
{
	; !2::
	Loop
	{  
		Gui, +LastFound   ;找到上一次的窗口  
		Gui, -Caption   ;隐藏标题栏
		Gui, +Owner    ;设置阻止任务栏按钮的显示
		Gui, +AlwaysOnTop   ;让GUI界面，开置顶
		WinSet, Transparent, 1 ;透明度
		Gui, Show,Maximize
		KeyWait ,LButton,D   ;等待左键点击
	GetKeyState,判断按钮,LButton,P  ;判断是否按住鼠标左键
		MouseGetPos,MX1,MY1   ;获取当前鼠标坐标
		xpos := MX1
		ypos := MY1
		Gui, +Owner    ;设置阻止任务栏按钮的显示
		Gui, Destroy ;重置GUI窗口，销毁窗口记录
		Gui, Show  ;显示重置窗口
	Loop  ;使用不断循环让窗口出现移动效果，松开为停止
	{
	Sleep ,1 ;适当加延迟，否则变量来不急赋值，导致画面会闪
		GetKeyState,判断按钮,LButton,P  ;判断是否按住鼠标左键
		MouseGetPos,MX2,MY2  ;获取移动后鼠标的坐标
		xpos:=MX2<MX1 ? MX2:MX1, ypos:=MY2<MY1 ? MY2:MY1   ;表达式计算截取区域四周自由变换。
		wpos1 :=Abs(MX1-MX2), hpos1 :=Abs(MY1-MY2) ;表达式计算截取区,两表达式之间，可用(,)逗号链接。  
		Gui, +LastFound   ;找到上一次的窗口  
		WinSet, Transparent, 150  ;透明度
		Gui, -Caption   ;隐藏标题栏
		Gui, +Owner    ;设置阻止任务栏按钮的显示
		; Gui, Color, 292929 ;设置背景颜色
		Gui, Color, ffd800
		Gui, Show, NA x%xpos% y%ypos% h%hpos1% w%wpos1%  
		WinGetPos, XXX1, YYY1, WWW1,HHH1, A  ; "A" 表示获取活动窗口的位置。截图区域确定后，执行获取位置大小。

	}until (判断按钮 = "U")  ;松开鼠标为停止
	}until (判断按钮 = "U")  ;松开鼠标为停止
	Gui, +LastFound   ;找到上一次的窗口  
	gui,Hide
	;~ WinClose, A  ;关闭窗口，参数A为，当前活动窗口。
	;~ return
	;~ ;---------截图显示功能（注释上和下总两行，截图即时完成。不注释可逐步调试）-----------
	;~ F6::
	时间命名 :=A_Now
	;~ MsgBox ,% 时间命名
	;~ PicPath := "D:\aaaa.png"
	; FileCreateDir, D:\picTP\   ;创建图片保存文件夹，如存在不会再次创建
	; PicPath := "D:\picTP\" 时间命名 ".png"  ;设置保存目录
	PicPath = %A_ScriptDir%\test.png
	; msgbox %PicPath%
	
	;~ PicPath := "D:\" 时间命名 ".png"  ;设置保存目录,此函数库保存格式为png，质量比jpg好。
	pToken := Gdip_Startup() ; Start gdi+
			; pBitmapAlpha := Gdip_CreateBitmapFromFile(PicPath)
			;~ pBitmapAlpha := Gdip_BitmapFromScreen("0|0|800|800")
			pBitmapAlpha := Gdip_BitmapFromScreen(xpos "|" ypos "|" wpos1 "|" hpos1)
			;首要设置鼠标获取屏幕坐标，CoordMode,Mouse, Screen。
	;Gdip_BitmapFromScreen参数分别是，xpos|ypos为左上角区域，wpos1|hpos1为右下角区域（需表达式运算得出）。
			ImgWidth := Gdip_GetImageWidth(pBitmapAlpha)  ; 获取宽度，高度，可省略
			ImgHeight := Gdip_GetImageHeight(pBitmapAlpha)
			;~ Gdip_SaveBitmapToFile(pBitmapAlpha, PicPath,"255") ;第三个参数控制图片质量
			Gdip_SaveBitmapToFile(pBitmapAlpha, PicPath) ;第三个参数控制图片质量
			Gdip_DisposeImage(pBitmapAlpha)
			
	; Gdip_Shutdown(pToken) ; close gdi+
	; Traytip, 截图完毕:, 宽: %ImgWidth% 高: %ImgHeight%`n保存为: %PicPath%
	; return
}

GetCursorShape(){   			;获取光标特征码 by nnrxin  
    VarSetCapacity( PCURSORINFO, 20, 0) ;为鼠标信息 结构 设置出20字节空间
    NumPut(20, PCURSORINFO, 0, "UInt")  ;*声明出 结构 的大小cbSize = 20字节
    DllCall("GetCursorInfo", "Ptr", &PCURSORINFO) ;获取 结构-光标信息
    if ( NumGet( PCURSORINFO, 4, "UInt")="0" ) ;当光标隐藏时，直接输出特征码为0
        return, 0
    VarSetCapacity( ICONINFO, 20, 0) ;创建 结构-图标信息
    DllCall("GetIconInfo", "Ptr", NumGet(PCURSORINFO, 8), "Ptr", &ICONINFO)  ;获取 结构-图标信息
    VarSetCapacity( lpvMaskBits, 128, 0) ;创造 数组-掩图信息（128字节）
    DllCall("GetBitmapBits", "Ptr", NumGet( ICONINFO, 12), "UInt", 128, "UInt", &lpvMaskBits)  ;读取 数组-掩图信息
    loop, 128{ ;掩图码
        MaskCode += NumGet( lpvMaskBits, A_Index, "UChar")  ;累加拼合
    }
    if (NumGet( ICONINFO, 16, "UInt")<>"0"){ ;颜色图不为空时（彩色图标时）
        VarSetCapacity( lpvColorBits, 4096, 0)  ;创造 数组-色图信息（4096字节）
        DllCall("GetBitmapBits", "Ptr", NumGet( ICONINFO, 16), "UInt", 4096, "UInt", &lpvColorBits)  ;读取 数组-色图信息
        loop, 256{ ;色图码
            ColorCode += NumGet( lpvColorBits, A_Index*16-3, "UChar")  ;累加拼合
        }  
    } else
        ColorCode := "0"
    DllCall("DeleteObject", "Ptr", NumGet( ICONINFO, 12))  ; *清理掩图
    DllCall("DeleteObject", "Ptr", NumGet( ICONINFO, 16))  ; *清理色图
    VarSetCapacity( PCURSORINFO, 0) ;清空 结构-光标信息
    VarSetCapacity( ICONINFO, 0) ;清空 结构-图标信息
    VarSetCapacity( lpvMaskBits, 0)  ;清空 数组-掩图
    VarSetCapacity( lpvColorBits, 0)  ;清空 数组-色图
    return, % MaskCode//2 . ColorCode  ;输出特征码
}